package org.jeecg.modules.oms.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.jeecg.modules.oms.entity.SemiProductSalesOrderTransaction;

import java.math.BigDecimal;
import java.util.List;

/**
 * 半成品销售订单交易记录Mapper接口
 */
public interface SemiProductSalesOrderTransactionMapper extends BaseMapper<SemiProductSalesOrderTransaction> {

    /**
     * 根据订单ID查询交易记录列表
     * @param orderId 订单ID
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> selectByOrderId(@Param("orderId") String orderId);

    /**
     * 分页查询交易记录
     * @param page 分页参数
     * @param transaction 查询条件
     * @return 分页结果
     */
    IPage<SemiProductSalesOrderTransaction> selectTransactionPage(Page<SemiProductSalesOrderTransaction> page, @Param("transaction") SemiProductSalesOrderTransaction transaction);

    /**
     * 根据交易类型查询记录
     * @param orderId 订单ID
     * @param transactionType 交易类型
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> selectByTransactionType(@Param("orderId") String orderId, @Param("transactionType") Integer transactionType);

    /**
     * 计算订单已付金额
     * @param orderId 订单ID
     * @return 已付金额
     */
    BigDecimal calculatePaidAmount(@Param("orderId") String orderId);

    /**
     * 计算订单预付款金额
     * @param orderId 订单ID
     * @return 预付款金额
     */
    BigDecimal calculatePrepaymentAmount(@Param("orderId") String orderId);

    /**
     * 计算订单尾款金额
     * @param orderId 订单ID
     * @return 尾款金额
     */
    BigDecimal calculateFinalPaymentAmount(@Param("orderId") String orderId);

    /**
     * 计算订单退款金额
     * @param orderId 订单ID
     * @return 退款金额
     */
    BigDecimal calculateRefundAmount(@Param("orderId") String orderId);

    /**
     * 统计交易记录数量
     * @param orderId 订单ID
     * @return 记录数量
     */
    Integer countByOrderId(@Param("orderId") String orderId);

    /**
     * 根据交易人查询记录
     * @param transactionPersonId 交易人ID
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> selectByTransactionPerson(@Param("transactionPersonId") String transactionPersonId);

    /**
     * 根据支付方式查询记录
     * @param paymentMethod 支付方式
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> selectByPaymentMethod(@Param("paymentMethod") Integer paymentMethod);

    /**
     * 根据时间范围查询交易记录
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 交易记录列表
     */
    List<SemiProductSalesOrderTransaction> selectByTimeRange(@Param("startTime") java.util.Date startTime, @Param("endTime") java.util.Date endTime);

    /**
     * 批量插入交易记录
     * @param transactionList 交易记录列表
     * @return 插入数量
     */
    int batchInsert(@Param("transactionList") List<SemiProductSalesOrderTransaction> transactionList);
}
